package com.lw.lwte.testengin.listener;

import com.lw.lwte.common.helper.FileHelper;
import com.lw.lwte.common.helper.TestngHelper;
import lombok.extern.slf4j.Slf4j;

import org.testng.*;

import java.util.List;

/**
 * @author liw
 * 1、通过ISuiteListener 方式对 stuite 丰富日志
 * 2、通过IHookable 方式对 测试执行处理
 */
@Slf4j
public class BasicSuitListener implements ISuiteListener, IHookable {
    // 打印分隔符
    public static final String SEPARATOR = "=======================================================";

    /**
     * 当测试套件开始执行时调用此方法。
     *
     * @param suite 当前执行的测试套件对象
     */
    @Override
    public void onStart(ISuite suite) {
        log.info("TestSuite [" + suite.getName() + "] start execution.");
        onExecutionStart();
    }

    /**
     * 当测试套件执行结束时调用此方法。
     *
     * @param suite 执行结束的测试套件对象
     */
    @Override
    public void onFinish(ISuite suite) {
        log.info("TestSuite [" + suite.getName() + "] stop execution.");
        onExecutionFinish();
    }

    private void onExecutionStart() {
        //欢迎辞
        welcome();

        //日志设置
        log.info(SEPARATOR);
        log.info("                    Start execution TestFramework");
        log.info(SEPARATOR);
    }

    private void onExecutionFinish() {
        log.info(SEPARATOR);
        log.info("                    Complete execution TestFramework");
        log.info(SEPARATOR);
    }

    /**
     * 显示启动信息。
     *
     * 该方法首先通过日志记录器输出启动信息："Starting lwte-TestEngine Framework"，表示lwte测试引擎框架正在启动。
     * 然后，它会从项目的资源目录中读取名为"/banner.txt"的文件，该文件通常包含一些启动时的欢迎信息或版权声明等。
     * 读取到的信息会被转换为字符串，并通过控制台输出，以展示给用户。
     */
    private void welcome() {

        log.info("Starting lwte-TestEngine Framework");
        String bannerInfo = FileHelper.readStreamToString(this.getClass().getResourceAsStream("/banner.txt"));
        System.out.println(bannerInfo);
    }
// todo: 暂时 不用 这个功能，后续开启并优化
//    private void collectTests(ISuite suite) {
//        log.info("Skip cases execution and collect test cases.");
//        List<CaseBean> caseBeanList = CaseBeanUtils.queryCaseList(suite);
//        for (CaseBean caseBean : caseBeanList) {
//            log.info("Case: {}.{}" + caseBean.getClassName(), caseBean.getName());
//        }
//        String reportPath = FileHelper.combine(System.getProperty("user.dir"), "target", "lete-result", "report", suite.getName() + ".json");
//        log.info("Save case list to file: " + reportPath);
//        CaseBeanUtils.saveCaseListToJsonFile(caseBeanList, reportPath);
//    }

    /**
     * 重写 run 方法，用于执行测试用例回调
     *
     * @param iHookCallBack 测试用例的回调接口
     * @param iTestResult   测试结果对象
     */
    @Override
    public void run(IHookCallBack iHookCallBack, ITestResult iTestResult) {
        if (TestngHelper.skipExecute()) {
            log.warn("Skip execute case: " + iTestResult.getName());
            iTestResult.setStatus(3); //设置为Skip
        } else {
            iHookCallBack.runTestMethod(iTestResult);
        }
    }
}
